package cn.redis.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @author yexi
 */
@Component
public class RedisGeoUtils {

    private static StringRedisTemplate redisTemplate;

    @Autowired
    public RedisGeoUtils(StringRedisTemplate redisTemplate) {
        RedisGeoUtils.redisTemplate = redisTemplate;
    }

    /**
     * 删除成员
     */
    public static Long removeGeo(String key, String... members) {
        return redisTemplate.opsForGeo().remove(key, members);
    }

    /***
     * 将指定的空间信息（纬度、经度、成员）添加到指定的key中。
     * @param key         key。示例: city。
     * @param longitude  经度。示例: 116.405285。
     * @param latitude   纬度。示例: 39.904989。
     * @param member     成员。示例: 北京。
     */
    public static Long geoAdd(String key, double longitude, double latitude, String member) {
        Long addedNum = redisTemplate.opsForGeo().add(key, new Point(longitude, latitude), member);
        return addedNum;
    }

    /***
     * 在指定的key当中，以指定的经纬度为中心，返回与中心的距离不超过给定最大距离的所有位置元素，并给出所有位置元素与中心的平均距离。
     * @param longitude  经度
     * @param latitude  纬度
     * @param distance  距离(这里默认为km)
     * @param limit     查询条数限制
     */
    public static GeoResults<RedisGeoCommands.GeoLocation<String>> nearByCircle(String key, double longitude, double latitude, double distance, Integer limit) {
        Circle circle = new Circle(new Point(longitude, latitude), new Distance(distance, Metrics.KILOMETERS));
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(limit);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius(key, circle, args);
        return results;
    }
}
